<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    // 对象的深复制
    // 还有一个更为复杂的方式，在jiankang.js第24个参考函数
    const obj = {
      key1: 'value1',
      key2: 'value2',
      key3: ['index1'],
      key4: {
        subKey1: 'subValue1'
      }
    }
    const obj2 = JSON.parse(JSON.stringify(obj))
    console.log(obj2)
/**
 * 24.深复制
 * 这里可以复制任意的复杂类型
 * @param {*} obj 需要复制的目标
 * @return {*}  反回的新数据
 */
    function deepClone(obj) {
      let res = null
      const reference = [Date, RegExp, Set, WeakSet, Map, WeakMap, Error]
      // node 环境中不支持可选链操作符 ?. 但是浏览器环境支持
      if (reference.includes(obj?.constructor)) {
        res = new obj.constructor(obj)
      } else if (Array.isArray(obj)) {
        res = []
        obj.forEach((e, i) => {
          res[i] = deepClone(e)
        })
      } else if (typeof obj === 'Object' && obj !== null) {
        res = {}
        for (const key in obj) {
          if (Object.hasOwnProperty.call(obj, key)) {
            res[key] = deepClone(obj[key])
          }
        }
      } else {
        res = obj
      }
      return res
    }
  </script>
</body>

</html>